package com.xyh.utils;

/**
 * 字符串处理工具类
 * 提供首字母大小写转换等常用操作
 */
public final class StringUtils {
    // 私有构造方法禁止实例化
    private StringUtils() {}

    /**
     * 首字母大写转换
     * @param input 原始字符串
     * @return 首字母大写的字符串（空值或空白字符串直接返回）
     */
    public static String upperCaseFirstLetter(String input) {
        if (isEmpty(input)) {
            return input;
        }
        return Character.toUpperCase(input.charAt(0)) + getSafeSubstring(input, 1);
    }

    /**
     * 首字母小写转换
     * @param input 原始字符串
     * @return 首字母小写的字符串（空值或空白字符串直接返回）
     */
    public static String lowerCaseFirstLetter(String input) {
        if (isEmpty(input)) {
            return input;
        }
        return Character.toLowerCase(input.charAt(0)) + getSafeSubstring(input, 1);
    }

    /**
     * 安全获取子字符串（处理索引越界）
     * @param str 原始字符串
     * @param beginIndex 开始索引
     * @return 子字符串，如果索引超出范围则返回空字符串
     */
    private static String getSafeSubstring(String str, int beginIndex) {
        return beginIndex < str.length() ? str.substring(beginIndex) : "";
    }

    /**
     * 判断字符串是否为空
     * @param cs 字符序列
     * @return 如果为null或长度为0则返回true
     */
    public static boolean isEmpty(CharSequence cs) {
        return cs == null || cs.length() == 0;
    }

    /**
     * 判断字符串是否不为空
     * @param cs 字符序列
     * @return 如果不为null且长度大于0则返回true
     */
    public static boolean isNotEmpty(CharSequence cs) {
        return !isEmpty(cs);
    }

    /**
     * 判断字符串是否为空白
     * @param cs 字符序列
     * @return 如果为null、长度为0或仅包含空白字符则返回true
     */
    public static boolean isBlank(CharSequence cs) {
        if (isEmpty(cs)) {
            return true;
        }
        for (int i = 0; i < cs.length(); i++) {
            if (!Character.isWhitespace(cs.charAt(i))) {
                return false;
            }
        }
        return true;
    }

    /**
     * 判断字符串是否不为空白
     * @param cs 字符序列
     * @return 如果不为null、长度大于0且包含非空白字符则返回true
     */
    public static boolean isNotBlank(CharSequence cs) {
        return !isBlank(cs);
    }

    /**
     * 安全的字符串比较，可处理null值
     * @param str1 第一个字符串
     * @param str2 第二个字符串
     * @return 如果两个字符串相等（包括都为null）则返回true
     */
    public static boolean equals(CharSequence str1, CharSequence str2) {
        if (str1 == str2) {
            return true;
        }
        if (str1 == null || str2 == null) {
            return false;
        }
        if (str1.length() != str2.length()) {
            return false;
        }
        if (str1 instanceof String && str2 instanceof String) {
            return str1.equals(str2);
        }
        // 比较每个字符
        for (int i = 0; i < str1.length(); i++) {
            if (str1.charAt(i) != str2.charAt(i)) {
                return false;
            }
        }
        return true;
    }

    /**
     * 安全的获取字符串，避免null
     * @param str 原始字符串
     * @return 如果原始字符串为null则返回空字符串，否则返回原始字符串
     */
    public static String defaultString(String str) {
        return str == null ? "" : str;
    }

    /**
     * 截断字符串到指定长度
     * @param str 原始字符串
     * @param maxLength 最大长度
     * @return 截断后的字符串
     */
    public static String truncate(String str, int maxLength) {
        if (isEmpty(str) || maxLength < 1) {
            return str;
        }
        if (str.length() <= maxLength) {
            return str;
        }
        return str.substring(0, maxLength);
    }
}